home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / support / subs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-18  |  4.4 KB  |  282 lines

  1. # include    <stdio.h>
  2. # include    <ingres.h>
  3. # include    <aux.h>
  4. # include    <access.h>
  5. # include    <lock.h>
  6. # include    <sccs.h>
  7. # include    <opsys.h>
  8. # include    <dirent.h>
  9.  
  10. SCCSID(@(#)subs.c    8.3    1/31/86)
  11.  
  12. /*
  13. ** These are subroutines common to RESTORE and PURGE.
  14. */
  15.  
  16. char        All;
  17. char        Qrymod;
  18. char        Superuser;
  19. char        Ask;
  20. char        Purge;
  21. char        Clean;
  22. char        Lastflag;
  23. DIR        *Direc;
  24. extern int    Status;
  25. extern char    *Usercode;
  26. char        **Dblist;
  27.  
  28.  
  29. /*
  30. **  INITIALIZE GLOBALS
  31. **
  32. **    Set up Usercode and Status
  33. */
  34.  
  35. initialize(argc, argv)
  36. int    argc;
  37. char    **argv;
  38. {
  39.     register int    i;
  40.     long        l;
  41.     extern char    *Flagvect[];
  42.     extern char    *Parmvect[];
  43.     register char    *p;
  44.     register char    **av;
  45.     char        datadir[MAXLINE];
  46.  
  47. #    ifdef    xTTR2
  48.     tTfp(40, 0, "entered initialize\n");
  49. #    endif
  50.     i = initucode(argc, argv, FALSE, NULL, -1);
  51. #    ifdef    xTTR2
  52.     tTfp(40, 1, "initucode ret:%d\n", i);
  53. #    endif
  54.     switch (i)
  55.     {
  56.       case 0:
  57.         break;
  58.  
  59.       case INVALIDUSR:
  60.         printf("You are not a valid INGRES user\n");
  61.         exit(-1);
  62.  
  63.       default:
  64.         syserr("initucode %d", i);
  65.     }
  66.     initdbpath(NULL, datadir, FALSE);
  67.  
  68.     /* scan flags */
  69. #    ifdef    xTTR2
  70.     tTfp(40, 2, "scanning flags\n");
  71. #    endif
  72.     for (av = Flagvect;  *av != NULL; av++)
  73.     {
  74.         p = *av;
  75.         if (p[0] != '-')
  76.         {
  77.         badflag:
  78.             printf("Bad flag: %s\n", p);
  79.             return (-1);
  80.         }
  81.         switch (p[1])
  82.         {
  83.           case 'a':
  84.             Ask++;
  85.             break;
  86.  
  87.           case 'p':
  88.             Purge++;
  89.             break;
  90.  
  91.           case 's':
  92.             if (sucheck())
  93.                 Superuser++;
  94.             else
  95.             {
  96.                 printf("You may not use the -s flag\n");
  97.                 exit(-1);
  98.             }
  99.             break;
  100.  
  101.           case 'f':
  102.             Clean++;
  103.             break;
  104.  
  105.           case 'T':
  106.             break;
  107.  
  108.           default:
  109.             goto badflag;
  110.         }
  111.     }
  112.     Dblist = Parmvect;
  113.     if (*Dblist == 0)
  114.     {
  115. #        ifdef    xTTR2
  116.         tTfp(40, 3, "doing all\n");
  117. #        endif
  118.         All++;
  119.         Direc = opendir(datadir);
  120.         if (Direc == NULL)
  121.         {
  122.             syserr("cannot read .../data/base");
  123.         }
  124.     }
  125. #    ifdef    xTTR2
  126.     tTfp(40, 0, "leaving initialize\n");
  127. #    endif
  128. }
  129.  
  130. /*
  131. **  CHECK FOR SUPERUSER
  132. **
  133. **    The user has requested the -s flag.  Can he do it?  Will Martha
  134. **    recover from cancer?  Will Dick get the girl?  Stay tuned for
  135. **    "sucheck".
  136. **
  137. **    Permission is based on the U_SUPER bit in the status field
  138. **    in the users file.
  139. */
  140.  
  141. sucheck()
  142. {
  143.     return (Status & U_SUPER);
  144. }
  145.  
  146.  
  147.  
  148. /*
  149. **  GET NEXT DATABASE
  150. **
  151. **    The next database to be purged is selected.  It comes from
  152. **    either the directory or the database list.
  153. **
  154. **    Getnxtdb() leaves the user in the database directory.
  155. */
  156.  
  157. char *
  158. getnxtdb()
  159. {
  160.     struct dirent        *dp;
  161.     register char        *db;
  162.     register FILE        *fd;
  163.     register int        i;
  164.     extern struct admin    Admin;
  165.     static char        dbpbuf[MAXLINE];
  166.  
  167. #    ifdef    xTTR2
  168.     tTfp(41, 0, "entered getnxtdb\n");
  169. #    endif
  170.     for (;;)
  171.     {
  172.         if (All)
  173.         {
  174.  
  175.             dp = readdir(Direc);
  176.             if (dp == NULL)
  177.                 db = NULL;
  178.             else
  179.             {
  180.                 if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
  181.                 {
  182.                     continue;
  183.                 }
  184.                 db = dp->d_name;
  185.             }
  186.         }
  187.         else
  188.         {
  189.             db = *Dblist++;
  190.         }
  191.         if (db == NULL)
  192.             return (NULL);
  193. #        ifdef    xTTR2
  194.         tTfp(41, 1, "using %s as Database\n", db);
  195. #        endif
  196.         i = initdbpath(db, dbpbuf, TRUE);
  197. #        ifdef    xTTR2
  198.         tTfp(41, 3, "initdbpath ret: %d, %s\n", i, dbpbuf);
  199. #        endif
  200.         switch (i)
  201.         {
  202.           case 0:
  203.           case 1:
  204.             break;
  205.  
  206.           case 2:
  207.           case 3:
  208.             printf("Database %s does not exist\n", db);
  209.             continue;
  210.  
  211.           default:
  212.             syserr("initdbpath %d", i);
  213.         }
  214.         if (chdir(dbpbuf) < 0)
  215.         {
  216.             printf("Cannot enter %s", dbpbuf);
  217.             continue;
  218.         }
  219. #        ifdef    xTTR2
  220.         tTfp(41, 4, "chdir ok, Superuser: %d\n", Superuser);
  221. #        endif
  222.         fd = fopen("admin", "r");
  223.         if (fd == NULL)
  224.         {
  225.             printf("Cannot open %s/admin\n", dbpbuf);
  226.             continue;
  227.         }
  228.         fread(&Admin.adhdr, sizeof Admin.adhdr, 1, fd);
  229.         fclose(fd);
  230. #        ifdef    xTTR2
  231.         tTfp(41, 5, "user: %.2s\n", Admin.adhdr.adowner);
  232. #        endif
  233.  
  234.         /* set qrymod flag from database status */
  235.         Qrymod = ((Admin.adhdr.adflags & A_QRYMOD) == A_QRYMOD);
  236.  
  237.         /* check for dba of database if not superuser */ 
  238.         if (Superuser || bequal(Admin.adhdr.adowner, Usercode, 2))
  239.             break;
  240.  
  241.         /*
  242.         ** not dba isn't an error if running in all mode since user
  243.         ** couln't have specified the database
  244.         */
  245.         if (All)
  246.             continue;
  247. printf("You are not the dba for %s\n", db);
  248.     }
  249. #    ifdef    xTTR2
  250.     tTfp(41, 6, "leaving getnxtdb, %s ok\n", db);
  251. #    endif
  252.     return (db);
  253. }
  254. /*
  255. ** ASK
  256. **    If Ask is set desplay prompt and look for 'y' and return TRUE
  257. **    If Ask is not set return TRUE
  258. */
  259.  
  260. ask(prompt)
  261. char    *prompt;
  262. {
  263.     register char    *p;
  264.     char        line[MAXLINE];
  265.     extern char    Ask;
  266.  
  267.     if (!Ask)
  268.         return (TRUE);
  269.     p = prompt;
  270.  
  271.     while (*p)
  272.     {
  273.         putchar(*p);
  274.         p++;
  275.     }
  276.  
  277.     if (fgets(line, MAXLINE, stdin) == NULL)
  278.         return(FALSE);
  279.  
  280.     return (line[0] == 'y');
  281. }
  282.